package com.zzs.common.core.response;

import com.zzs.common.core.enums.ResponseCode;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * 统一 API 响应封装类，提供标准化的返回结构。
 * <p>
 * 该类封装了 HTTP 响应的状态码、消息和数据，适用于所有 API 返回值。
 * 采用泛型 `T` 以支持不同类型的数据返回，提高代码复用性。
 * </p>
 * @param <T> 响应数据类型
 * @author zzs
 * @date 2025/03/17
 */
@AllArgsConstructor
@NoArgsConstructor
@Data
public class Result<T> {
    /**
     * 响应状态码，参考 {@link ResponseCode} 进行定义。
     */
    private int code;
    /**
     * 响应消息，通常用于描述状态信息，如 "操作成功" 或 "请求失败"。
     */
    private String message;
    /**
     * 具体的响应数据，支持泛型，可能为空。
     */
    private T data;

    /**
     * 返回成功的响应，无数据。
     *
     * @return 成功的 `Result` 实例
     */
    public static <Void>Result<Void> success() {
        return new Result<>(ResponseCode.SUCCESS.getCode(), ResponseCode.SUCCESS.getMessage(), null);
    }

    /**
     * 返回成功的响应，并携带数据。
     *
     * @param data 响应数据
     * @return 成功的 `Result` 实例，包含数据
     */
    public static <T>Result<T> success(T data) {
        return new Result<>(ResponseCode.SUCCESS.getCode(), ResponseCode.SUCCESS.getMessage(), data);
    }

    /**
     * 返回失败的响应，使用默认错误消息。
     *
     * @param resultCode 预定义的错误码枚举
     * @return 失败的 `Result` 实例
     */
    public static <Void>Result<Void> error(ResponseCode resultCode) {
        return new Result<>(resultCode.getCode(), resultCode.getMessage(), null);
    }

    /**
     * 返回失败的响应，并自定义错误消息。
     *
     * @param resultCode 预定义的错误码枚举
     * @param message    自定义错误信息
     * @return 失败的 `Result` 实例
     */
    public static <Void>Result<Void> error(ResponseCode resultCode, String message) {
        return new Result<>(resultCode.getCode(), message, null);
    }
}
